"""
https://leetcode.cn/problems/validate-ip-address/description/

468. 验证IP地址
中等
相关标签
相关企业
给定一个字符串 queryIP。如果是有效的 IPv4 地址，返回 "IPv4" ；如果是有效的 IPv6 地址，返回 "IPv6" ；如果不是上述类型的 IP 地址，返回 "Neither" 。

有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址， “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。

一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址，其中:

1 <= xi.length <= 4
xi 是一个 十六进制字符串 ，可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
在 xi 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址，而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。

 

示例 1：

输入：queryIP = "172.16.254.1"
输出："IPv4"
解释：有效的 IPv4 地址，返回 "IPv4"
示例 2：

输入：queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出："IPv6"
解释：有效的 IPv6 地址，返回 "IPv6"
示例 3：

输入：queryIP = "256.256.256.256"
输出："Neither"
解释：既不是 IPv4 地址，又不是 IPv6 地址
 

提示：

queryIP 仅由英文字母，数字，字符 '.' 和 ':' 组成。

"""
class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        def is_ipv4_num(s:str)->bool:
            if len(s)==0:
                return False
            if s[0]=='0' and s!='0':
                return False
            return s.isdigit() and 0<=int(s)<=255
        
        def is_ipv4(s:str)->bool:
            if not s:
                return False
            l=0
            count=0
            for r in range(len(s)+1):
                if r==len(s) or s[r]=='.':
                    count+=1
                    if count>4:
                        return False
                    temp=s[l:r]
                    if not is_ipv4_num(temp):
                        return False
                    l=r+1
            return count==4
        
        def is_ipv6_num(s:str)->bool:
            # print(f'6n:{s}')
            if not (1<=len(s)<=4):
                return False
            for c in s:
                if not (ord('0')<=ord(c)<=ord('9') or ord('a')<=ord(c)<=ord('f') or ord('A')<=ord(c)<=ord('F')):
                    return False
            return True
        
        def is_ipv6(s:str)->bool:
            if not s:
                return False
            l=0
            count=0
            for r in range(len(s)+1):
                if r==len(s) or s[r]==':':
                    count+=1
                    if count>8:
                        # print(f'count={count}')
                        return False
                    temp=s[l:r]
                    if not is_ipv6_num(temp):
                        return False
                    l=r+1
            # print(f'count={count}')
            return count==8
        
        if is_ipv4(queryIP):
            return 'IPv4'
        if is_ipv6(queryIP):
            return 'IPv6'
        return 'Neither'

        pass

if __name__=='__main__':
    sol=Solution()
    queryIp='2001:0db8:85a3:0:0:8A2E:0370:7334'
    res=sol.validIPAddress(queryIp)
    print(res)
    pass